//引入公共函数
let util = require('../../utils/util');

//引入WebSocket操作函数
let ws = require('../../utils/websocket');

//引入App
let app = getApp();

//声明存放页面实例的变量
let that;

//声明聊天数据刷新定时器
let chatRefreshInterval;

//页面Page方法
Page({

  //程序公共数据变量
  data:{

    //跳转到的消息框id
    toView: '',

    //服务员数据
    serviceInfo: null,

    //商户ID
    storeId: util.globalData('storeId'),

    //存放用户id
    userId: null,

    //存放当前用户的数据
    userData: {},

    //暂存需要发送的消息
    msg: '',

    //是否锁定发送消息按钮
    sendMsgBtnDisabled: true,

    //是否显示加载更多聊天数据的动画
    loadingChatList: false,

    //显示聊天记录区块的index
    showChatChunkIndex: 1,

    //显示聊天记录的每个区块的第一个可见聊天消息index
    showChatMsgIndex: 0

  },

  /**
   * 进入聊天界面
   */

  onLoad:function(params){
    
    //存放页面实例
    that = this;

    //获取商户ID
    that.data.storeId = util.globalData('storeId');

    //获取传入的用户ID
    that.data.userId = params.userId;

    //获得登录的服务员数据
    let {userData} = util.globalData('loginData');

    console.log(userData);

    //将服务员数据更新到界面
    that.setData({serviceInfo: userData});

    //设置初始显示30条消息记录从倒数30条的那条记录开始
    that.showChatMsgIndex = app.globalData.userListData[params.userId].userMsg.length - 30;

    //根据用户ID更新对应用户的聊天数据到聊天界面
    that.updateChatList(params.userId);

    //恢复消息输入框内容
    that.recoverMsgInput();

  },

  /**
   * 关闭聊天界面
   */

  onUnload: function(){

    console.log('关闭聊天界面');

    //保存消息输入框内容
    that.saveMsgInput();

    //停止刷新聊天数据的定时器
    clearInterval(chatRefreshInterval);

  },

  /**
   * 滚动到顶部监听函数
   */

  scrollTop: function(e) {

    //调用加载更多消息的函数
    that.loadOtherChatMsg();

  },

  /**
   * 加载更多消息记录函数
   */

  loadOtherChatMsg: function() {

    //判断是否已经正在加载更多消息
    if(that.data.loadingChatList) {
      return;
    }

    //设置当前正在加载更多消息
    that.setData({loadingChatList: true});

    //设置显示消息记录区块index+1，代表显示下一个区块记录
    that.data.showChatChunkIndex++;

    //获取所有消息记录的个数
    var chatMsgSum = that.data.userData.userMsg.length;

    //获取当前区块的第一条消息记录的index
    that.showChatMsgIndex = chatMsgSum - that.data.showChatChunkIndex * 30;

    //更新聊天记录界面
    that.updateChatList(that.data.userId, true);

    //设置已完成此次更多消息的加载
    that.setData({loadingChatList: false});

  },

  /**
   * 保存消息输入框内容函数
   */

  saveMsgInput: function() {

    //判断是否存在用户ID和准备发送的消息
    if(that.data.userId && that.data.msg) {

      //存放当前消息输入框消息
      app.globalData.userListData[that.data.userId].msgInputContent = that.data.msg;

      //存入本地缓存
      wx.setStorageSync(that.data.userId, app.globalData.userListData[that.data.userId]);

    }

  },

  /**
   * 显示表情容器
   */

  showEmoticonsGroup: function() {
    
    console.log('打开表情容器');

    util.showToast({
      title: '系统提示',
      content: '发送表情功能尚未完成，敬请期待噢！'
    });

  },

  /**
   * 替换表情字符为图片表情函数（暂未实现）
   */

  replaceMsgEmoticon: function() {
    /*
    此部分功能暂时封存，等待第二版本升级
    var msgList = that.data.userData.userMsg;
    var emoticonConfig = util.config('emoticons');
    //声明消息表情数据数组
    var msgEmoticon = [];
    var emoticonLocationArray = [];
    var emoticonName = '';
    var emoticonIndex = '';
    for(var msgIndex in msgList) {
      for(var emoticonKeyWord in emoticonConfig) {
        var emoticonLocationArray = util.getStrKeyWordArray(msgList[msgIndex].msg, emoticonKeyWord, 0, []);
        if(emoticonLocationArray.length > 0) {

          for(var emoticonIndex in emoticonLocationArray) {
            msgEmoticon.push({
              emoticonName: emoticonConfig[emoticonLocationArray[emoticonIndex].word].name,
              emoticonIndex: emoticonConfig[emoticonLocationArray[emoticonIndex].word].index,
              emoticonCharIndex: emoticonLocationArray[emoticonIndex].index,
              emoticonCharWord: emoticonLocationArray[emoticonIndex].word
            });
          }

        }
      }
      if(msgEmoticon.length > 0) {
        msgList[msgIndex].emoticon = msgEmoticon;
        msgEmoticon = [];
      }
    }
    that.data.userData.userMsg = msgList;
    console.log(that.data.userData.userMsg);
    //app.globalData.userListData[that.data.userId].userMsg = msgList;
    //wx.setStorageSync(that.data.userId, app.globalData.userListData[that.data.userId]);
    */
  },

  /**
   * 恢复消息输入框内容函数
   */

  recoverMsgInput: function() {

    //判断是否存在用户ID且本地缓存中存在与该用户的消息输入内容
    if(that.data.userId && wx.getStorageSync(that.data.userId).msgInputContent) {

      //从本地缓存获取准备发送但未发送的消息
      that.data.msg = wx.getStorageSync(that.data.userId).msgInputContent;

      //设置发送按钮可用
      that.data.sendMsgBtnDisabled = false;

      //设置消息到消息输入框并且更新发送按钮状态
      that.setData({

        //因为消息仍在输入框但未发送退出界面后的输入框内容缓存
        msg: that.data.msg, 

        //发送按钮的可用状态
        sendMsgBtnDisabled: that.data.sendMsgBtnDisabled

      });
    }

  },

  /**
   * 清除消息输入框内容函数
   */

  clearMsgInput: function() {

    //清空消息输入框和禁用发送按钮
    that.setData({

      msg: '', 
      sendMsgBtnDisabled: true

    });

    //存储消息输入框输入内容为空
    that.saveMsgInput();
    console.log(that.data.msg);
  },

  /**
   * 监听输入函数
   */

  inputMsg: function(e) {

    //获取输入的消息
    that.data.msg = e.detail.value;

    //判断文本框内容是否为空
    if(that.data.msg != '') {

      //不为空则设置发送按钮为可按状态
      that.setData({sendMsgBtnDisabled: false});

    }
    else {

      //为空则设置发送按钮为禁用状态
      that.setData({sendMsgBtnDisabled: true});

    }

  },

  /**
   * 发送消息函数
   */

  sendMsg: function() {

    //判断是否已经登录，未登录则不能发送消息
    if(!util.status('connected')) {

      util.showError('无法发送', '您与通讯服务器已经断开连接请返回主界面重新登录上线');

      return;

    }

    //获得发送消息内容
    var msg = that.data.msg;

    //判断发送的消息是否为空且是否存在用户ID
    if(msg && msg != '' && that.data.userId) {

      //清空发送消息的文本框
      that.clearMsgInput();
      console.log('发送消息' + msg);

      //添加回复内容到聊天数据并更新聊天界面返回发送时的时间戳
      var msgId = that.addReply(that.data.userId, msg);

      //发起websocket的请求
      ws.request({

        //商店ID
        storeId: that.data.storeId,

        //验证身份的3rdSession
        _3rdSession: util.globalData('_3rdSession'),

        //调用的接口
        _interface: 'msg/sendMsg',
        
        //发送的数据
        data: {

          storeId: that.data.storeId,

          //用户ID
          userId: that.data.userId,

          //发送的消息
          msg: msg

        }

      }, {

        //发送消息成功
        success: function() {
          console.log('发送消息成功');
          //更新此消息的发送状态为成功
          that.updateMsgSendStatus(msgId, '');

        },
        fail: function(errCode) {
          console.log(errCode);
          console.log('发送消息失败');
          //更新此消息的发送状态为失败
          that.updateMsgSendStatus(msgId, 'warn');
          //判断错误内容
          switch(errCode) {
            case '-0050':
              that.addTip(msgId, '微信服务器处理发送消息操作超时');
            break;
            case '-0051':
              that.addTip(msgId, '回复消息时无法通过服务器验证');
            break;
            case '-0052':
              that.addTip(msgId, '非法的凭证类型');
            break;
            case '-0053':
              thta.addTip(msgId, '用户ID非法');
            break;
            case '-0054':
              that.addTip(msgId, '您未在规定时间内回复消息，会话已失效');
            break;
            case '-0055':
              that.addTip(msgId, '发送消息限额已到，请等待用户发送消息');
            break;
            case '-0056':
              that.addTip(msgId, '未获得接口授权');;
            break;
            default: 
              that.addTip(msgId, '未知的错误：' + errCode);
            break;
          }
        }
      });
    }
  },

  /**
   * 重试发送曾经发送失败的消息
   */

  reSendMsg: function(e) {
    console.log(e);
    //根据点击的错误状态图标得到msgId
    var msgId = e.currentTarget.id.split('-')[1];
    
    //存放可能需要重试发送的消息的数据
    var msgData = {};
    
    //遍历所有聊天数据
    for(var msgIndex in that.data.userData.userMsg) {

      //判断是否找到此消息
      if(that.data.userData.userMsg[msgIndex].timestamp == msgId) {

        //将此消息取出放到nsgData变量
        msgData = that.data.userData.userMsg[msgIndex];

        //找到就跳出
        break;
      }

    }
    console.log(msgData);
    //调用模态框询问服务员是否重新发送此消息
    wx.showModal({
      title: '重新发送消息',
      content: '此消息发送失败，是否尝试重新发送？',
      success: function(modal) {
        if(modal.confirm) {
          //确定重新发送此消息
          console.log('重试发送消息');
          //设置当前需要发送的消息
          that.data.msg = msgData.msg;
          
          //调用消息发送函数
          that.sendMsg();
        }
        else {
          //取消重新发送此消息
          console.log('取消重试发送消息');
        }
      }
    });
  },

  /**
   * 往对应消息下面添加提示
   */

  addTip: function(msgId, tipMsg) {

    //遍历所有消息记录找到当前这条消息
    for(var msgIndex in that.data.userData.userMsg) {

      //判断是否对应传入的msgId
      if(that.data.userData.userMsg[msgIndex].timestamp == msgId) {

        //设置提示内容
        that.data.userData.userMsg[msgIndex].tipMsg = tipMsg;

        //存入公共的聊天记录数据中
        app.globalData.userListData[that.data.userId].userMsg[msgIndex] = that.data.userData.userMsg[msgIndex];

        //设置到聊天界面中显示
        that.setChatMsgList(that.data.userData.userMsg, that.showChatMsgIndex, that.data.userData.userMsg.length);

        //设置当前滚动到提示内容处显示
        that.setData({toView: 'tipMsg-' + msgId});

        //将最新的聊天记录数据存入和本地缓存中
        wx.setStorageSync(that.data.userId, app.globalData.userListData[that.data.userId]);

        //找到了跳出
        break;

      }
    }
  },

  /**
   * 添加回复到聊天记录数据
   */

  addReply: function(userId, replyContent) {

    //判断是否存在回复的内容以及存在于该用户的聊天记录数据
    if(replyContent && app.globalData.userListData[userId]) {

      //获得当前时间戳
      var timestamp = Date.now();

      //获取当前的聊天数据作为老旧数据
      var oldMsgList = app.globalData.userListData[userId].userMsg;

      //往与用户的聊天数据中添加一条服务员发送的消息数据
      app.globalData.userListData[userId].userMsg.push({

        //发送者类型
        sender: 'me',

        //回复的内容
        msg: replyContent,

        //发送时的时间戳
        timestamp: timestamp,
        
        //此消息的发送时间显示
        chatTimeTip: '' + (oldMsgList[oldMsgList.length - 1] ? (timestamp - oldMsgList[oldMsgList.length - 1].timestamp > 180000 ? util.formatTime(new Date()) : '') : util.formatTime(new Date())),

        //消息的发送状态
        sendStatus: 'waiting',

        emoticon: [],

        //此消息是否可见
        show: true

      });
      
      //更新聊天列表界面
      that.updateChatList(userId);

      //清空发送消息的文本框
      that.clearMsgInput();
      
      console.log(that.data.userData);

      //将加入回复的聊天数据存入本地缓存
      wx.setStorageSync(userId, app.globalData.userListData[userId]);

      //返回发送时的时间戳供后续更新消息发送状态使用
      return timestamp;

    }
  },

  /**
   * 设置消息的可见状态，防止消息一次性显示过多 
   */

  setChatMsgList: function(chatListData, start, end) {

    //判断截取消息记录的起始点是否小于0，如果小于0则设为0
    start = start < 0 ? 0 : start;

    //判断截取消息记录的结束点是否大于聊天记录数据的个数，如果大于则设为聊天记录数的个数
    end = end > chatListData.length ? chatListData.length : end;
   
    //遍历所有聊天数据
    for(var msgIndex in chatListData) {

      //判断当前聊天记录数据index是否处于截取起始点和结束点之间
      if(msgIndex >= start && msgIndex <= end) {

        //设置此消息在界面中可见
        chatListData[msgIndex].show = true;

      }
      else {

        //设置此消息在界面中隐藏
        chatListData[msgIndex].show = false;

      }
    }

    //将设置完毕的聊天记录数据放回变量中
    that.data.userData.userMsg = chatListData;

    //更新聊天界面达到显示与隐藏部分消息的功能
    that.setData({userData: that.data.userData});
  
  },

  /**
   * 更新消息发送状态
   */

  updateMsgSendStatus: function(msgId, status) {

    //判断是否存在msgId和status变量
    if(msgId && (status || status == '')) {

      //遍历与此用户的聊天记录数据
      for(var msgIndex in that.data.userData.userMsg) {

        //如果找到对应时间戳的消息则对此消息的发送状态进行更新
        if(that.data.userData.userMsg[msgIndex].timestamp == msgId) {

          //设置此消息发送状态为status变量
          that.data.userData.userMsg[msgIndex].sendStatus = status;

          //更新该用户的聊天数据到公共的用户聊天数据中
          app.globalData.userListData[that.data.userId].userMsg[msgIndex] = that.data.userData.userMsg[msgIndex];

          //更新最新的聊天数据到聊天列表界面
          that.setChatMsgList(that.data.userData.userMsg, that.showChatMsgIndex, that.data.userData.userMsg.length);

          //存储最新的聊天数据到本地缓存
          wx.setStorageSync(that.data.userId, app.globalData.userListData[that.data.userId]);

        }
      }
    }
  },

  /**
   * 更新聊天界面列表函数
   */

  updateChatList: function(userId, noToView) {
    
    //判断是否传入的userId以及是否存在对应用户公共的用户聊天数据列表
    if(userId && app.globalData.userListData[userId]) {

      //获取用户聊天数据存入页面数据
      that.data.userData = app.globalData.userListData[userId];
      
      //改变页面标题
      wx.setNavigationBarTitle({
        title: '正在与 ' + that.data.userData.userName + ' 聊天'
      });

      //应用用户聊天数据列表更新到与用户的聊天界面
      that.setChatMsgList(that.data.userData.userMsg, that.showChatMsgIndex, that.data.userData.userMsg.length);

      if(!noToView) {
        //设置当前视图到最新接收或最新发送的消息框上
        that.setData({toView: 'msg-' + that.data.userData.userMsg[that.data.userData.userMsg.length - 1].timestamp});
      }

      //清除刷新消息定时器
      clearInterval(chatRefreshInterval);
      
      //设置定时获取公共聊天数据列表，如果有最新的消息则更新到界面上
      chatRefreshInterval = setInterval(function() {
        
        //如果当前聊天记录列表的最新一条消息的时间戳不等于此用户公共聊天数据列表中最新一条消息的时间戳
        if(that.data.userData.userMsg[that.data.userData.userMsg.length - 1].timestamp != app.globalData.userListData[userId].userMsg[app.globalData.userListData[userId].userMsg.length - 1].timestamp) {
          console.log(that.data.userData);
          //设置将被清除未读消息个数的用户
          util.globalData('clearUnreadMsgUser', userId);

          //设置未读消息为0，因为现在已经属于阅读状态
          app.globalData.userListData[userId].userUnreadMsgCount = 0;

          //重新调用本函数更新聊天记录列表
          that.updateChatList(userId);

        }

      //设置每50毫秒刷新一遍
      }, 50);
    
    }
    else {
      
      //获取公共聊天记录数据消息失败（可能是无聊天记录的情况下强行进入聊天界面）
      util.showError('读取失败', '读取聊天记录失败，请返回或重新启动小程序');

    }
  }
})